home *** CD-ROM | disk | FTP | other *** search
- package koala.dynamicjava.classinfo;
-
- import java.lang.reflect.Modifier;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.List;
- import koala.dynamicjava.util.AmbiguousFieldException;
-
- public class ClassInfoUtilities {
- // $FF: synthetic field
- private static Class class$Ljava$lang$Object;
-
- public static ConstructorInfo lookupConstructor(ClassInfo var0, ClassInfo[] var1) throws NoSuchMethodException {
- List var2 = getConstructors(var0, var1.length);
- LinkedList var3 = new LinkedList();
-
- for(ConstructorInfo var5 : var2) {
- if (hasCompatibleSignatures(var5.getParameterTypes(), var1)) {
- var3.add(var5);
- }
- }
-
- if (var3.isEmpty()) {
- throw new NoSuchMethodException(var0.getName() + " constructor");
- } else {
- Iterator var6 = var3.iterator();
-
- ConstructorInfo var7;
- for(var7 = (ConstructorInfo)var6.next(); var6.hasNext(); var7 = selectTheMostSpecificConstructor(var7, (ConstructorInfo)var6.next())) {
- }
-
- return var7;
- }
- }
-
- public static boolean isAssignableFrom(ClassInfo var0, ClassInfo var1) {
- if (var0.isPrimitive()) {
- if (var0.equals(var1)) {
- return true;
- } else if (var1 != null && var1.isPrimitive()) {
- Class var2 = var0.getJavaClass();
- Class var3 = var1.getJavaClass();
- if (var2 == Short.TYPE) {
- return var3 == Byte.TYPE;
- } else if (var2 == Integer.TYPE) {
- return var3 == Byte.TYPE || var3 == Short.TYPE || var3 == Character.TYPE;
- } else if (var2 == Long.TYPE) {
- return var3 == Byte.TYPE || var3 == Short.TYPE || var3 == Integer.TYPE;
- } else if (var2 == Float.TYPE) {
- return var3 == Byte.TYPE || var3 == Short.TYPE || var3 == Integer.TYPE || var3 == Float.TYPE;
- } else if (var2 != Double.TYPE) {
- return false;
- } else {
- return var3 == Byte.TYPE || var3 == Short.TYPE || var3 == Integer.TYPE || var3 == Float.TYPE || var3 == Double.TYPE;
- }
- } else {
- return false;
- }
- } else if (var1 != null && !var0.equals(var1)) {
- return isAncestorOf(var0, var1) || isInterfaceOf(var0, var1);
- } else {
- return true;
- }
- }
-
- public static FieldInfo getField(ClassInfo var0, String var1) throws NoSuchFieldException, AmbiguousFieldException {
- for(ClassInfo var2 = var0; var2 != null; var2 = var2.getSuperclass()) {
- FieldInfo[] var3 = var2.getFields();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- if (var3[var4].getName().equals(var1)) {
- return var3[var4];
- }
- }
-
- ClassInfo[] var10 = var2.getInterfaces();
- FieldInfo var5 = null;
-
- for(int var6 = 0; var6 < var10.length; ++var6) {
- FieldInfo var7 = null;
-
- try {
- var7 = getField(var10[var6], var1);
- } catch (NoSuchFieldException var9) {
- }
-
- if (var7 != null) {
- if (var5 != null && !var5.equals(var7)) {
- throw new AmbiguousFieldException(var1);
- }
-
- var5 = var7;
- }
- }
-
- if (var5 != null) {
- return var5;
- }
- }
-
- throw new NoSuchFieldException(var1);
- }
-
- public static FieldInfo getOuterField(ClassInfo var0, String var1) throws NoSuchFieldException, AmbiguousFieldException {
- boolean var2 = Modifier.isStatic(var0.getModifiers());
-
- for(ClassInfo var3 = var0 != null ? var0.getDeclaringClass() : null; var3 != null; var3 = var3.getDeclaringClass()) {
- var2 |= Modifier.isStatic(var3.getModifiers());
-
- try {
- FieldInfo var4 = getField(var3, var1);
- if (!var2 || Modifier.isStatic(var4.getModifiers())) {
- return var4;
- }
- } catch (NoSuchFieldException var5) {
- }
- }
-
- throw new NoSuchFieldException(var1);
- }
-
- public static MethodInfo lookupMethod(ClassInfo var0, String var1, ClassInfo[] var2) throws NoSuchMethodException {
- List var3 = getMethods(var0, var1, var2.length);
- LinkedList var4 = new LinkedList();
-
- for(MethodInfo var6 : var3) {
- if (hasCompatibleSignatures(var6.getParameterTypes(), var2)) {
- var4.add(var6);
- }
- }
-
- if (var4.isEmpty()) {
- throw new NoSuchMethodException(var1);
- } else {
- Iterator var7 = var4.iterator();
-
- MethodInfo var8;
- for(var8 = (MethodInfo)var7.next(); var7.hasNext(); var8 = selectTheMostSpecificMethod(var8, (MethodInfo)var7.next())) {
- }
-
- return var8;
- }
- }
-
- public static MethodInfo lookupOuterMethod(ClassInfo var0, String var1, ClassInfo[] var2) throws NoSuchMethodException {
- boolean var3 = Modifier.isStatic(var0.getModifiers());
-
- for(ClassInfo var4 = var0 != null ? var0.getDeclaringClass() : null; var4 != null; var4 = var4.getDeclaringClass()) {
- var3 |= Modifier.isStatic(var4.getModifiers());
-
- try {
- MethodInfo var5 = lookupMethod(var4, var1, var2);
- if (!var3 || Modifier.isStatic(var5.getModifiers())) {
- return var5;
- }
- } catch (NoSuchMethodException var6) {
- }
- }
-
- throw new NoSuchMethodException(var1);
- }
-
- public static List getMethods(ClassInfo var0, String var1, int var2) {
- LinkedList var3 = new LinkedList();
- if (var0.isInterface()) {
- MethodInfo[] var4 = var0.getMethods();
-
- for(int var5 = 0; var5 < var4.length; ++var5) {
- if (var4[var5].getName().equals(var1) && var4[var5].getParameterTypes().length == var2) {
- var3.add(var4[var5]);
- }
- }
-
- ClassInfo[] var8 = var0.getInterfaces();
-
- for(int var6 = 0; var6 < var8.length; ++var6) {
- var3.addAll(getMethods(var8[var6], var1, var2));
- }
- } else {
- for(ClassInfo var7 = var0; var7 != null; var7 = var7.getSuperclass()) {
- MethodInfo[] var9 = var7.getMethods();
-
- for(int var10 = 0; var10 < var9.length; ++var10) {
- if (var9[var10].getName().equals(var1) && var9[var10].getParameterTypes().length == var2) {
- var3.add(var9[var10]);
- }
- }
- }
- }
-
- return var3;
- }
-
- private static List getConstructors(ClassInfo var0, int var1) {
- LinkedList var2 = new LinkedList();
- ConstructorInfo[] var3 = var0.getConstructors();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- if (var3[var4].getParameterTypes().length == var1) {
- var2.add(var3[var4]);
- }
- }
-
- return var2;
- }
-
- private static ConstructorInfo selectTheMostSpecificConstructor(ConstructorInfo var0, ConstructorInfo var1) {
- ClassInfo[] var2 = var0.getParameterTypes();
- ClassInfo[] var3 = var1.getParameterTypes();
-
- for(int var4 = 0; var4 < var2.length; ++var4) {
- if (var2[var4] != var3[var4]) {
- return isAssignableFrom(var2[var4], var3[var4]) ? var1 : var0;
- }
- }
-
- return var0;
- }
-
- private static MethodInfo selectTheMostSpecificMethod(MethodInfo var0, MethodInfo var1) {
- ClassInfo[] var2 = var0.getParameterTypes();
- ClassInfo[] var3 = var1.getParameterTypes();
-
- for(int var4 = 0; var4 < var2.length; ++var4) {
- if (var2[var4] != var3[var4]) {
- return isAssignableFrom(var2[var4], var3[var4]) ? var1 : var0;
- }
- }
-
- return var0;
- }
-
- private static boolean hasCompatibleSignatures(ClassInfo[] var0, ClassInfo[] var1) {
- for(int var2 = 0; var2 < var0.length; ++var2) {
- if (!isAssignableFrom(var0[var2], var1[var2])) {
- return false;
- }
- }
-
- return true;
- }
-
- private static boolean isAncestorOf(ClassInfo var0, ClassInfo var1) {
- ClassInfo var2;
- for(var2 = var1.getSuperclass(); var2 != null && !var2.equals(new JavaClassInfo(class$Ljava$lang$Object != null ? class$Ljava$lang$Object : (class$Ljava$lang$Object = class$("java.lang.Object")))); var2 = var2.getSuperclass()) {
- if (var2.equals(var0)) {
- return true;
- }
- }
-
- return var2 != null && var2.equals(var0);
- }
-
- private static boolean isInterfaceOf(ClassInfo var0, ClassInfo var1) {
- if (!var0.isInterface()) {
- return false;
- } else {
- for(ClassInfo var2 = var1; var2 != null && !var2.equals(new JavaClassInfo(class$Ljava$lang$Object != null ? class$Ljava$lang$Object : (class$Ljava$lang$Object = class$("java.lang.Object")))); var2 = var2.getSuperclass()) {
- ClassInfo[] var3 = var2.getInterfaces();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- if (var3[var4].equals(var0)) {
- return true;
- }
-
- if (isInterfaceOf(var0, var3[var4])) {
- return true;
- }
- }
- }
-
- return false;
- }
- }
-
- // $FF: synthetic method
- static Class class$(String var0) {
- try {
- return Class.forName(var0);
- } catch (ClassNotFoundException var2) {
- throw new NoClassDefFoundError(((Throwable)var2).getMessage());
- }
- }
-
- private ClassInfoUtilities() {
- }
- }
-